{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 第二步：调整树的参数：max_depth & min_child_weight\n",
    "(粗调，参数的步长为2；下一步是在粗调最佳参数周围，将步长降为1，进行精细调整)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/anaconda3/lib/python3.6/site-packages/sklearn/cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n",
      "  \"This module will be removed in 0.20.\", DeprecationWarning)\n"
     ]
    }
   ],
   "source": [
    "# import tool kit\n",
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "\n",
    "import pandas as pd \n",
    "import numpy as np\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold\n",
    "\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "from matplotlib import pyplot\n",
    "import seaborn as sns\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# read data\n",
    "dpath = './data/'\n",
    "train = pd.read_csv(dpath + 'RentListingInquries_FE_train.csv')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "y_train = train['interest_level']\n",
    "train = train.drop(['interest_level'], axis=1)\n",
    "X_train = np.array(train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# 各类样本不均衡，交叉验证是采用StratifiedKFold，在每折采样时各类样本按比例采样\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第一轮参数调整得到的n_estimators最优值是314，其余参数继续默认"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'max_depth': range(3, 10, 2), 'min_child_weight': range(1, 6, 2)}"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#max_depth 建议3-10， min_child_weight=1／sqrt(ratio_rare_event) =5.5\n",
    "max_depth = range(3,10,2)\n",
    "min_child_weight = range(1,6,2)\n",
    "param_test2_1 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "param_test2_1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/anaconda3/lib/python3.6/site-packages/sklearn/model_selection/_search.py:761: DeprecationWarning: The grid_scores_ attribute was deprecated in version 0.18 in favor of the more elaborate cv_results_ attribute. The grid_scores_ attribute will not be available from 0.20\n",
      "  DeprecationWarning)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "([mean: -0.59637, std: 0.00321, params: {'max_depth': 3, 'min_child_weight': 1},\n",
       "  mean: -0.59612, std: 0.00337, params: {'max_depth': 3, 'min_child_weight': 3},\n",
       "  mean: -0.59612, std: 0.00322, params: {'max_depth': 3, 'min_child_weight': 5},\n",
       "  mean: -0.58823, std: 0.00386, params: {'max_depth': 5, 'min_child_weight': 1},\n",
       "  mean: -0.58804, std: 0.00388, params: {'max_depth': 5, 'min_child_weight': 3},\n",
       "  mean: -0.58789, std: 0.00325, params: {'max_depth': 5, 'min_child_weight': 5},\n",
       "  mean: -0.59422, std: 0.00533, params: {'max_depth': 7, 'min_child_weight': 1},\n",
       "  mean: -0.59205, std: 0.00511, params: {'max_depth': 7, 'min_child_weight': 3},\n",
       "  mean: -0.59132, std: 0.00428, params: {'max_depth': 7, 'min_child_weight': 5},\n",
       "  mean: -0.61676, std: 0.00589, params: {'max_depth': 9, 'min_child_weight': 1},\n",
       "  mean: -0.60761, std: 0.00462, params: {'max_depth': 9, 'min_child_weight': 3},\n",
       "  mean: -0.60339, std: 0.00380, params: {'max_depth': 9, 'min_child_weight': 5}],\n",
       " {'max_depth': 5, 'min_child_weight': 5},\n",
       " -0.58789173509456394)"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb2_1 = XGBClassifier(learning_rate=0.1, \n",
    "                       n_estimators=314, # 上一轮得出\n",
    "                       max_depth=5, \n",
    "                       min_child_weight=1, \n",
    "                       gamma=0, \n",
    "                       subsample=0.3, \n",
    "                       colsample_bytree=0.8, \n",
    "                       colsample_bylevel=0.7, \n",
    "                       objective= 'multi:softprob',\n",
    "                       seed=3)\n",
    "gsearch2_1 = GridSearchCV(xgb2_1, param_grid=param_test2_1, scoring='neg_log_loss', n_jobs=-1, cv=kfold)\n",
    "gsearch2_1.fit(X_train, y_train)\n",
    "\n",
    "gsearch2_1.grid_scores_, gsearch2_1.best_params_,     gsearch2_1.best_score_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "{'mean_fit_time': array([  147.50524039,   140.22546864,   133.69331985,   212.71082959,\n",
       "         4867.62108541,   220.51359973,   303.09733562,   311.63733191,\n",
       "          304.90393066,   427.78132544,   424.32397494,   426.68848028]),\n",
       " 'mean_score_time': array([ 0.70018511,  0.65725956,  0.61757889,  1.11031923,  1.36006336,\n",
       "         1.19177222,  2.61806202,  2.53261843,  2.44369478,  5.7826849 ,\n",
       "         5.29630718,  3.55030389]),\n",
       " 'mean_test_score': array([-0.59636781, -0.59612343, -0.59612182, -0.5882277 , -0.58803822,\n",
       "        -0.58789174, -0.59422434, -0.59204705, -0.59131778, -0.61675989,\n",
       "        -0.60760768, -0.60339309]),\n",
       " 'mean_train_score': array([-0.56585917, -0.56695733, -0.56754423, -0.48597224, -0.49310563,\n",
       "        -0.49813757, -0.36062267, -0.38581731, -0.40307974, -0.22340238,\n",
       "        -0.27476463, -0.30741493]),\n",
       " 'param_max_depth': masked_array(data = [3 3 3 5 5 5 7 7 7 9 9 9],\n",
       "              mask = [False False False False False False False False False False False False],\n",
       "        fill_value = ?),\n",
       " 'param_min_child_weight': masked_array(data = [1 3 5 1 3 5 1 3 5 1 3 5],\n",
       "              mask = [False False False False False False False False False False False False],\n",
       "        fill_value = ?),\n",
       " 'params': [{'max_depth': 3, 'min_child_weight': 1},\n",
       "  {'max_depth': 3, 'min_child_weight': 3},\n",
       "  {'max_depth': 3, 'min_child_weight': 5},\n",
       "  {'max_depth': 5, 'min_child_weight': 1},\n",
       "  {'max_depth': 5, 'min_child_weight': 3},\n",
       "  {'max_depth': 5, 'min_child_weight': 5},\n",
       "  {'max_depth': 7, 'min_child_weight': 1},\n",
       "  {'max_depth': 7, 'min_child_weight': 3},\n",
       "  {'max_depth': 7, 'min_child_weight': 5},\n",
       "  {'max_depth': 9, 'min_child_weight': 1},\n",
       "  {'max_depth': 9, 'min_child_weight': 3},\n",
       "  {'max_depth': 9, 'min_child_weight': 5}],\n",
       " 'rank_test_score': array([ 9,  8,  7,  3,  2,  1,  6,  5,  4, 12, 11, 10], dtype=int32),\n",
       " 'split0_test_score': array([-0.59113594, -0.59023904, -0.59102163, -0.58141545, -0.58206871,\n",
       "        -0.58238023, -0.58617556, -0.58239036, -0.58415182, -0.60538863,\n",
       "        -0.60153248, -0.59729039]),\n",
       " 'split0_train_score': array([-0.56743902, -0.5687347 , -0.5689289 , -0.48797858, -0.49515117,\n",
       "        -0.49984933, -0.36150189, -0.38832796, -0.40464562, -0.22462645,\n",
       "        -0.27652231, -0.30818678]),\n",
       " 'split1_test_score': array([-0.59505538, -0.59479491, -0.59429523, -0.58680482, -0.58495481,\n",
       "        -0.5861832 , -0.59348436, -0.59235886, -0.59040254, -0.61802152,\n",
       "        -0.60289552, -0.60304874]),\n",
       " 'split1_train_score': array([-0.5666215 , -0.56779408, -0.56826472, -0.48577709, -0.4928471 ,\n",
       "        -0.49851146, -0.36081795, -0.38590651, -0.40284295, -0.22358562,\n",
       "        -0.2775095 , -0.307079  ]),\n",
       " 'split2_test_score': array([-0.59634737, -0.59716822, -0.59634024, -0.58947714, -0.58969316,\n",
       "        -0.58954765, -0.59286103, -0.59395101, -0.59167698, -0.61773616,\n",
       "        -0.60883664, -0.60379021]),\n",
       " 'split2_train_score': array([-0.56565904, -0.56661957, -0.56703641, -0.48535099, -0.4927808 ,\n",
       "        -0.49784962, -0.35982298, -0.38472659, -0.40265024, -0.22298219,\n",
       "        -0.27539055, -0.30888212]),\n",
       " 'split3_test_score': array([-0.60035931, -0.59947554, -0.59939954, -0.59138931, -0.59153376,\n",
       "        -0.58989587, -0.59590385, -0.594074  , -0.59299841, -0.62131614,\n",
       "        -0.61278575, -0.60355922]),\n",
       " 'split3_train_score': array([-0.56491032, -0.56604557, -0.56674159, -0.48707123, -0.49341668,\n",
       "        -0.4978108 , -0.35988593, -0.38495616, -0.40198234, -0.22333738,\n",
       "        -0.2732246 , -0.30514074]),\n",
       " 'split4_test_score': array([-0.59894183, -0.59894028, -0.59955352, -0.59205293, -0.59194183,\n",
       "        -0.5914528 , -0.60269949, -0.59746269, -0.59736099, -0.62133837,\n",
       "        -0.61198934, -0.60927869]),\n",
       " 'split4_train_score': array([-0.56466598, -0.56559274, -0.5667495 , -0.48368328, -0.49133241,\n",
       "        -0.49666665, -0.36108458, -0.38516934, -0.40327752, -0.22248026,\n",
       "        -0.27117617, -0.307786  ]),\n",
       " 'std_fit_time': array([  1.96167044e+00,   4.29021856e+00,   4.59054186e-01,\n",
       "          1.33554549e+00,   2.32337650e+03,   7.68545996e-01,\n",
       "          3.88035204e+00,   1.49508872e+00,   3.22992011e+00,\n",
       "          2.07618486e+01,   1.58734818e+01,   3.80995676e+01]),\n",
       " 'std_score_time': array([ 0.08673331,  0.04923299,  0.03565265,  0.14434928,  0.30940164,\n",
       "         0.13296008,  0.17786472,  0.10294279,  0.09722794,  0.9873648 ,\n",
       "         1.01548714,  1.8549836 ]),\n",
       " 'std_test_score': array([ 0.00321416,  0.00336615,  0.00322229,  0.00386318,  0.00388171,\n",
       "         0.00324761,  0.00532587,  0.00510707,  0.00428152,  0.00589197,\n",
       "         0.00461811,  0.0037995 ]),\n",
       " 'std_train_score': array([ 0.00104318,  0.0011547 ,  0.00089108,  0.00147625,  0.00123269,\n",
       "         0.00104146,  0.00066435,  0.00131624,  0.00088724,  0.00071596,\n",
       "         0.00229191,  0.00127835])}"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "gsearch2_1.cv_results_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -0.587892 using {'max_depth': 5, 'min_child_weight': 5}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "/anaconda3/lib/python3.6/site-packages/sklearn/utils/deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAELCAYAAADz6wBxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xl8lOW9///XZ7ISgoAkKLIIIkiQTUCsK1jkFIVicSvY\nxVqXVuvpsfZntT2tHM7X47Glx621LlVbrRWxKpVaRNBaaWstAkZFQKDWJYAGIrsJJJnP74+5M0yS\nSTJkMpks7+fjMY+Zue/ruu/rvrN85rrvaz6XuTsiIiLNFUp3A0REpH1TIBERkaQokIiISFIUSERE\nJCkKJCIikhQFEhERSYoCiYiIJEWBREREkqJAIiIiSclMdwNaQ0FBgQ8cODDdzRARaVdWrVq13d0L\nmyrXKQLJwIEDWblyZbqbISLSrpjZ+4mU06UtERFJigKJiIgkRYFERESS0inukYhI4iorKykpKaGi\noiLdTZFWkpubS79+/cjKympWfQUSEamlpKSEbt26MXDgQMws3c2RFHN3ysrKKCkpYdCgQc3ahi5t\niUgtFRUV9OrVS0GkkzAzevXqlVQPVIFEROpREOlckv15K5A04tPVr7N78WL8wIF0N0VEpM3SPZJG\n7Pzd79i1cCEZBQX0uOB8el50EVlHHZXuZomItCnqkTSiz//cTP/776PLiBGU3Xc/m86awodXf4u9\nf/kLHg6nu3kiHdbOnTv5xS9+0ay6d9xxB59++mkLt6hlTJo0qdlZNn7/+9+zdu3aQ9pWRUUFEyZM\nYPTo0Rx//PHMmTOnWftuigJJIywUIv+MM+h/7z0MXraMXpdfTvkbb/DhFVfyz6lnU/bgg1Tt2JHu\nZop0OB01kCSjbiBJRE5ODn/605944403KC4uZsmSJbz66qst3jZd2kpQdr++9L7uOxRe8y12L1vG\njvnzKZ33U7bdeReHnT2VnrNnkzt6tG5SSocy9w9vs3bL7hbd5vCjDmPO549vtMyNN97IP//5T8aM\nGcOUKVPo3bs3TzzxBPv372fmzJnMnTuXffv2cdFFF1FSUkJ1dTU/+tGP+Pjjj9myZQtnnnkmBQUF\nvPTSS3G3n5+fz1VXXcXixYvp06cPt9xyC9/73vf44IMPuOOOO5gxYwbvvfceX/nKV9i3bx8AP//5\nzznllFNYuHAhP//5z3nhhRf46KOPmDhxIsuXL+fII4+st5/y8nIuvfRS3njjDYYNG0Z5eXl03dKl\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1a1bec3828>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# summarize results\n",
    "print(\"Best: %f using %s\" % (gsearch2_1.best_score_, gsearch2_1.best_params_))\n",
    "test_means = gsearch2_1.cv_results_[ 'mean_test_score' ]\n",
    "test_stds = gsearch2_1.cv_results_[ 'std_test_score' ]\n",
    "train_means = gsearch2_1.cv_results_[ 'mean_train_score' ]\n",
    "train_stds = gsearch2_1.cv_results_[ 'std_train_score' ]\n",
    "\n",
    "pd.DataFrame(gsearch2_1.cv_results_).to_csv('my_preds_maxdepth_min_child_weights_1.csv')\n",
    "\n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(max_depth), len(min_child_weight))\n",
    "train_scores = np.array(train_means).reshape(len(max_depth), len(min_child_weight))\n",
    "\n",
    "for i, value in enumerate(max_depth):\n",
    "    pyplot.plot(min_child_weight, -test_scores[i], label= 'test_max_depth:'   + str(value))\n",
    "#for i, value in enumerate(min_child_weight):\n",
    "#    pyplot.plot(max_depth, train_scores[i], label= 'train_min_child_weight:'   + str(value))\n",
    "    \n",
    "pyplot.legend()\n",
    "pyplot.xlabel( 'max_depth' )                                                                                                      \n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig('max_depth_vs_min_child_weght_1.png' )"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "最好的max_depth=5， min_child_weight = 5。可以在max_depth = [4,5,6]，min_child_weight=[6,7,8]继续搜索。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
